/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ni;

import controller.ChatController;
import controller.User;
import protocol.*;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;



/**
 *
 * @author CarlaSauvanaud
 */
public class UDPReceive extends Thread {

    private DatagramSocket socket;
    private boolean active;
    private ChatController controller;

    public UDPReceive(ChatController controller){
        this.controller = controller;
        this.active = true;

        try {
                socket = new DatagramSocket(Port.receptionUDP);

            } catch (SocketException ex) {
                System.out.println(ex.getMessage() + " (new datagram server)");
            }
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }


    
    @Override
    public void run() {

        while (active) {

            byte[] tab = new byte[1024];

            DatagramPacket dp = new DatagramPacket(tab, 1024);

            try {
                socket.receive(dp);
            } catch (IOException ex) {
                System.out.println(ex.getMessage() + " (socket receive server)");
            }


            try {
                Hello h = null;
                Bye b = null;
                ChatMessage cm = null;
                FileNotify fn = null;
                AckFile af = null;

                //Recuperation du message contenu dans le paquet reçu,
                //grace à la fonction static de Message
                Message m = ChatNI.deserialiser(dp.getData());

                System.out.println("Adresse message recu : " + m.getSourceAddress());
                if (!m.getSourceAddress().equals(controller.getLocalUser().getUserAddress())) {
                    //Si le message reçu est un hello
                    if (m instanceof Hello) {
                        h = (Hello) m;
                        //debug affichage hello recu
                        System.out.println("Hello recu : " + h);

                        //Si on recoi le hello que l on vient d envoyer aux aurtes
                        //on ne le prend pas en compte

                        if (h.isRepreq()) {
                            //envoie d'un helloBack
                            controller.controllerSendHelloBack(false, new User(h.getUsername(), h.getSourceAddress()));
                        }

                        //ajout d'un contact dans la liste de contact
                        //le hello contient le username, le paquet reçu contient l'adresse IP
                        controller.controllerAddUser(h.getUsername(), h.getSourceAddress());

                        //Affichage hello dans la fenetre principale
                        controller.controllerDisplayHello(h);

                    } //Si le message reçu est un bye
                    else if (m instanceof Bye) {
                        b = (Bye) m;
                        //enlever liste contact
                        controller.controllerRemoveUser(b.getSourceAddress());

                        //Affichage du bye dans la fenetre principale
                        controller.controllerDisplayBye(b);

                        //Affichage du bye dans la fenetre principale
                        controller.controllerDisplayBye(b);

                    } //Si le message reçu est un message de discussion
                    else if (m instanceof ChatMessage) {
                        cm = (ChatMessage) m;
                        //Pas de pb si on recoi un message d'un utilisateur pas connecté
                        controller.controllerDisplayMessage(cm);

                        //Pas d'envoi d'acuse de reception

                    } //TODO : Le cas des fichiers n'est pas traité pour le moment
                    else if(m instanceof FileNotify) {
                        fn = (FileNotify)m;
                        controller.controllerDisplayFileNotify(fn);
                    }
                    else if(m instanceof AckFile){
                        af = (AckFile)m;
                        controller.controllerDisplayAckFile(af);
                    }
                    else {
                        System.out.println("Problème de désérialisation : type inconnu !");
                    }
                }

            } catch (Exception ex) {
                System.out.println(ex.getMessage() + " (exception instanceof server)");
            }

        }
        socket.close();

        System.out.println("J'ai fermé la socket de réception");
    }
}

